/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2023-10-21
  * @brief   使用举例-串口管理
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "tim.h"
#include "usart.h"

#include "uart_handler.h"

/* 私有宏定义-----------------------------------------------------------------*/
#define USART1_UART_HR_CH                       (0u) /* 串口管理序号 */

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
static uint8_t txBuf[128]; /* 串口管理所需发送缓冲区 */
static uint8_t rxBuf[128]; /* 串口管理所需接收缓冲区 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/

/**
  * @brief  定时器中断函数
  *
  * @param  None
  *
  * @retval None
  */
void TIM1_UP_IRQHandler(void)
{
    static uint8_t ret;
    static uint8_t rxBufTmp[100];
    
    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 
    {
        /* 串口管理轮询处理 */
        ret = uart_hr_poll(USART1_UART_HR_CH);
        /* 接收完成 */
        if(RET_OK == ret)
        {
            /* 串口管理读取数据 */
            uint16_t dataLen = uart_hr_read_rx_buf(USART1_UART_HR_CH, rxBufTmp, sizeof(rxBufTmp));
            rxBufTmp[dataLen] = '\0';
            DEBUG_LOG("uart rec:%s", rxBufTmp);
        } /* 接收超时 无需求可忽略此返回值 */
        else if(RET_TIMEOUT == ret)
        {
            WARN_LOG("uart rec timeout");
        }
        
        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
    }
}

/**
  * @brief  串口中断函数
  *
  * @param  None
  *
  * @retval None
  */
void USART1_IRQHandler(void)
{
    static uint8_t rxData, txData, ret;
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        rxData = USART_ReceiveData(USART1);
        /* 写入接收缓存 */
        ret = uart_hr_write_rx_buf(USART1_UART_HR_CH, &rxData, 1);
        if(0 == ret)
        {
            WARN_LOG("uart_hr_write_rx_buf failure");
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
    
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {
        /* 读出发送缓存 */
        ret = uart_hr_read_tx_buf(USART1_UART_HR_CH, &txData, 1);
        if(0 != ret)
        {
            USART_SendData(USART1, txData);
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_TXE);
    }
}

/**
  * @brief  串口发送中断开关函数
  *
  * @param  None
  *
  * @retval None
  */
void uart_tx_en(uint8_t enState)
{
    if(enState)
    {
        /* 使能发送中断 */
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    }
    else
    {
        /* 关闭发送中断 */
        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    }
}

int main(int argc, char *argv[])
{
    VERSION_LOG("example-uart_handler", 1, 0, 0);
    
    /* 定时器初始化 1ms */
    tim1_init_config(100-1, 720-1);
    /* 串口初始化 115200 */
    usart1_init_config(115200);
    
    /* 串口管理初始化 */
    uart_hr_init(USART1_UART_HR_CH, txBuf, sizeof(txBuf), rxBuf, sizeof(rxBuf), uart_tx_en, 115200, 2000);
    
    uint8_t mes[] = "uart handler";
    /* 串口管理发送数据 */
    uart_hr_write_tx_buf(USART1_UART_HR_CH, mes, sizeof(mes));

    while(1)
    {
        
    }
}

